package com.example.shutdown_v1.repository;

import com.example.shutdown_v1.entity.SensorData;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;

import java.time.LocalDateTime;
import java.util.List;
import java.util.Optional;

/**
 * 传感器数据Repository
 */
@Repository
public interface SensorDataRepository extends JpaRepository<SensorData, Long> {
    
    /**
     * 查询指定传感器的最新N条数据
     * @param sensorId 传感器ID
     * @param limit 限制条数
     * @return 传感器数据列表
     */
    @Query(value = "SELECT * FROM sensor_data WHERE sensor_id = :sensorId ORDER BY receive_time DESC LIMIT :limit", 
           nativeQuery = true)
    List<SensorData> findLatestBySensorId(@Param("sensorId") String sensorId, @Param("limit") int limit);
    
    /**
     * 查询指定时间范围内的数据
     * @param start 开始时间
     * @param end 结束时间
     * @return 传感器数据列表
     */
    List<SensorData> findByReceiveTimeBetween(LocalDateTime start, LocalDateTime end);
    
    /**
     * 查询指定传感器和时间范围的数据
     * @param sensorId 传感器ID
     * @param start 开始时间
     * @param end 结束时间
     * @return 传感器数据列表
     */
    List<SensorData> findBySensorIdAndReceiveTimeBetween(String sensorId, LocalDateTime start, LocalDateTime end);
    
    /**
     * 统计指定传感器的数据条数
     * @param sensorId 传感器ID
     * @return 数据条数
     */
    long countBySensorId(String sensorId);
    
    /**
     * 查询传感器最新10条数据
     */
    List<SensorData> findTop10BySensorIdOrderByReceiveTimeDesc(String sensorId);
    
    /**
     * 分页查询传感器数据
     */
    Page<SensorData> findBySensorId(String sensorId, Pageable pageable);
    
    /**
     * 删除指定时间之前的数据
     * @param cutoffTime 截止时间
     * @return 删除的记录数
     */
    @Modifying
    @Query("DELETE FROM SensorData s WHERE s.receiveTime < :cutoffTime")
    int deleteByReceiveTimeBefore(@Param("cutoffTime") LocalDateTime cutoffTime);
    
    /**
     * 统计指定时间之前的数据量
     * @param cutoffTime 截止时间
     * @return 数据条数
     */
    long countByReceiveTimeBefore(LocalDateTime cutoffTime);
    
    /**
     * 查询传感器的最新一条数据
     * @param sensorId 传感器ID
     * @return 最新的传感器数据
     */
    Optional<SensorData> findFirstBySensorIdOrderByReceiveTimeDesc(String sensorId);
}

